package edu.tms.security;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import edu.tms.bean.RolePermission;
import edu.tms.bean.User;
import edu.tms.dao.RolePermissionDaoImp;


/**
 * 	Authorizer
 *	身 份份验证通过后，由这个组件对登录人员进行访问控制的筛查，比如“who can do what”， 
 *	或者“who can do which actions”。Shiro 采用“基于 Realm”的方法，即用户（又称 Subject）、用户组、角色和 permission 的聚合体。
 *
 * @author Administrator
 *
 */
public class Authorizer {
	private Map<String, Integer> positions;

	/**
	 * 获得用户菜单
	 * @param user
	 * @return
	 */
	public String[] getNav(User user){
		//得到用户拥有的职位
		if(positions == null){
			//实例化身份认证类
			Authenticator a = new Authenticator();
			positions = a.authenticate(user);
		}
		//用户对应的权限列表，String为权限名称，Integer为权限状态
		Map<String, Integer> permissions = new HashMap<String, Integer>();
		//迭代职位，只有拥有的职位才能取得对应的权限
		for (String key : positions.keySet()) {
			if(positions.get(key) == 1){
				putPermision(permissions, key);
			}
		}
		//迭代权限，只有正常的权限才能使用
		List<String> list = new ArrayList<>(); 
		for (String key : permissions.keySet()) {
			if(permissions.get(key) == 1){
				list.add(key);
			}
		}
		return convert(list);
	}
	
	/**
	 * 获取职位
	 * @return
	 */
	public String[] getPositions(User user){
		if(positions == null){
			Authenticator a = new Authenticator();
			positions = a.authenticate(user);
		}
		List<String> list = new ArrayList<>(); 
		for (String key : positions.keySet()) {
			if(positions.get(key) == 1){
				list.add(key);
			}
		}
		return convert(list);
	}
	
	/**
	 * List转String[]
	 * @param list
	 * @return
	 */
	private String[] convert(List<String> list){
		Object[] os = list.toArray();
		String[] strs = new String[os.length];
		for (int i = 0; i < strs.length; i++) {
			strs[i] = (String) os[i];
		}
		return strs;
	}
	/**
	 * 获取角色所对应的权限列表
	 * @param permissions
	 * @param key
	 */
	public void putPermision(Map<String, Integer> permissions, String key){
		RolePermissionDaoImp dao = new RolePermissionDaoImp();
		try {
			List<RolePermission> list = dao.findAll(key);
			for (RolePermission rp : list) {
				permissions.put(rp.getPermissionName(), rp.getRolePermissionState());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}
